<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>借用构造函数</title>
</head>

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div> 
    <script>
        var nodes = document.getElementsByTagName( 'div' );

        for ( var i = 0, len = nodes.length; i < len; i++ ){
            nodes[ i ].onclick = function(){
                alert ( i );
            }
        }; 
        // 这是因为 div 节点的onclick 事件是被异步触发的，当事件被触发的时候，for 循环早已结束，此时变量 i 的值已经是5，所以在 div 的 onclick 事件函数中顺着作用域链从内到外查找变量 i 时，查找到的值总是 5。

        // 1作用域，2生命周期
        // 对于全局变量来说，全局变量的生存周期当然是永久的，除非我们主动销毁这个全局变量。而对于在函数内用 var 关键字声明的局部变量来说，当退出函数时，这些局部变量即失去了它们的价值，它们都会随着函数调用的结束而被销毁：

        // 把每次循环的 i 值都封闭起来
        // 当在事件函数中顺着作用域链中从内到外查找变量 i 时，会先找到被封闭在闭包环境中的 i，
        for (var i = 0, len = nodes.length; i < len; i++) {
            (function (i) {
                nodes[i].onclick = function () {
                    console.log(i); //既然局部变量所在的环境还能被外界访问，这个局部变量就有了不被销毁的理由。
                }
            })(i)
        }; 
    </script>
</body>

</html>